home *** CD-ROM | disk | FTP | other *** search
Wrap
Text File | 1997-12-12 | 29.7 KB | 974 lines | [ TEXT/ALFA]
## -*-Tcl-*- # ################################################################### # Vince's Additions - an extension package for Alpha # # FILE: "Docprojects.tcl" # created: 29/7/97 {4:59:22 pm} # last update: 12/12/97 {4:01:25 pm} # Author: Vince Darley # E-mail: <darley@fas.harvard.edu> # mail: Division of Engineering and Applied Sciences, Harvard University # Oxford Street, Cambridge MA 02138, USA # www: <http://www.fas.harvard.edu/~darley/> # # Copyright (c) 1997 Vince Darley # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # ################################################################### ## alpha::extension documentProjects 1.5.2 { alpha::package require Alpha 7.0b4 namespace eval Docproj {} # dummy value ensureset docProject(name) [list "None" "Project2" "Thesis"] newPref var currentProject "None" Docproj "" docProject(name) "varitem" menu::buildProc "Current Project" \ {menu::buildFlagMenu "Current Project" list currentProject DocprojmodeVars} menu::insert global submenu 5 {Current Project} menu::insert global items 5 \ "documentProjectPrefs…" "userDetails…" \ "<E<SremoveDocumentTemplate…" "<S<BeditDocumentTemplate…" \ "<SnewDocumentTemplate…" \ "<E<SremoveProject…" "<S<BeditProject…" "<SnewProject…" newPref binding updateFileVersion "/f<U" Docproj menu::insert winUtils items end \ "showInFinder" \ "(-" \ "updateDate" \ "[menu::bind DocprojmodeVars(updateFileVersion) -]" lunion elec::MenuTemplates "createHeader" "newDocument" catch "unbind F1 bind::Completion" menu::insert elec items end \ {menu -n FunctionComments -p menu::generalProc { "/eusual" "/e<Isimple" "/e<OwithAuthor" "/e<Uupdate" }} set "newDocument::handlers(Document Projects)" Docproj::newHandler # Use this simple proc if we don't have the newDocument package. if {![alpha::package exists newDocument]} { ;proc file::newDocument {} { beep Docproj::newHandler [list -n [statusPrompt "New doc name:"]] } } else { alpha::package require newDocument } # new document templates mode specific (useful if you have lots of templates) newPref flag docTemplatesModeSpecific 1 Docproj # Do we auto-update the header of a file? newPref flag autoUpdateHeader 1 Docproj # call on saveHook proc Docproj::changeProject {name} { if {$name == "*"} { return } menu::flagProc "Current Project" $name } # call on saveHook hook::register saveHook updateHeaderHook } maintainer { "Vince Darley" darley@fas.harvard.edu <http://www.fas.harvard.edu/~darley/> } uninstall {this-file} help {file "Documentprojects Help"} # user projects if ![info exists docProject(addendum)] { set docProject(addendum) { {none} {about some other stuff} {deep problems}} set docProject(default_modes) { {} {C++ Tcl} {TeX}} set docProject(extra) [list "" "Freely distributable" "Copyright (C) 1997 the author."] set docProject(license) [list "" "" ""] } proc updateHeaderHook name { global DocprojmodeVars if $DocprojmodeVars(autoUpdateHeader) { # update does no harm if it fails so we call it for all # modes with no worries. getWinInfo -w $name a if $a(dirty) { file::updateDate $name } } } # header/source templates (NOTE: FORMAT OF THIS LIST MAY CHANGE) llunion elec::DocTemplates 1 \ { * "Empty" * "" *} \ { * "Default" * t_default *} \ { TeX "Basic LaTeX document" "None" t_latex * {article report letter book slides}} \ { C++ "Basic C++ header file" "Header" t_cpp_header * } \ { C++ "Basic C++ source file" "Source" t_cpp_source * } \ { HTML "HTML document" * t_html * } ## # \ # { C++ "Cpptcl Class Source" Source t_cpptcl_source "Cpptcl"} \ # { C++ "Cpptcl Class Header" Header t_cpptcl_header "Cpptcl"} \ # { Tcl "Itcl Class" * t_itcl_class "Cpptcl"} \ # { Tcl "Blank Tcl Header" Header "\#" "Vince's Additions"} \ # { C++ "EvoX Class Source" Source t_cpptcl_source "EvoX"} \ # { C++ "EvoX Class Header" Header t_cpptcl_header "EvoX"} ## # used for file description headers if $synchroniseWithInternetConfig { catch {set user(author) [icGetPref RealName]} catch {set user(email) "<[icGetPref Email]>"} catch {set user(www) "<[icGetPref WWWHomePage]>"} catch {set user(organisation) [icGetPref Organization]} } ensureset user(author) "Ken McKen" ensureset user(email) "ken@kenny.com" ensureset user(www) "http://www.kenny.com/" ensureset user(organisation) "Ken Corp." ensureset user(address) "Rose St, MA 02143, USA" ensureset user(author_initials) "VMD" ## # ################################################################### # Used to be "docProjEngine.tcl", now one file: # ################################################################### ## proc global::userDetails {} { dialog::pkg_options "Docprojects" \ "User Details (some maye be from Internet Config)" 1 user } proc global::documentProjectPrefs {} { dialog::pkg_options "Docproj" "Preferences for your Document Projects" } proc Docproj::newHandler {args} { set doc [file::createDocument "new $args"] if {[getModifiers] & 72} { file::pickProject } file::createHeader $doc return "" } proc file::pickProject {} { global DocprojmodeVars docProject set item [listpick -p "Pick a project…" -L $DocprojmodeVars(currentProject) \ $docProject(name)] if {$item != ""} { Docproj::changeProject $item } return $item } proc file::projectName {} { global DocprojmodeVars return $DocprojmodeVars(currentProject) } proc file::projectAddendum {} { global docProject DocprojmodeVars return [lindex $docProject(addendum) \ [lsearch -exact $docProject(name) $DocprojmodeVars(currentProject)]] } proc file::projectExtra {} { global docProject DocprojmodeVars return [lindex $docProject(extra) \ [lsearch -exact $docProject(name) $DocprojmodeVars(currentProject)]] } proc file::projectLicense {} { global docProject DocprojmodeVars set ret [lindex $docProject(license) \ [lsearch -exact $docProject(name) $DocprojmodeVars(currentProject)]] if {$ret == ""} { return "none" } else { return $ret } } namespace eval functioncomments {} ## # ---------------------------------------------------------------------- # # "file::functionComment" -- # # This procedure generates a nice little comment box # like this one here. # # Results: # Well it doesn't return anything, but it allows you to # enter each item simply, moving from one to the next with Tab # # Side effects: # Not much # # ---------------------------------------------------------------------- ## proc functioncomments::usual { {simple ""} {author 0} } { global user set fn [getSelect] set fn [lindex $fn end] beginningOfLine set t "-------------------------------------------------------------------------\r" append t "\r" append t "\"$fn\" --\r" append t "\r •description•\r" if { $simple != "simple" } { append t "\rResults:\r •results•\r\rSide effects:\r •side effects•\r" } if $author { append t "\r--Version--Author------------------Changes-------------------------------" append t "\r 1.0 $user(email) original\r" } append t "-------------------------------------------------------------------------" set t [file::commentTextBlock $t] elec::CenterInsertion $t } proc functioncomments::simple {} { return [functioncomments::usual simple 0]} proc functioncomments::withAuthor {} { return [functioncomments::usual "" 1] } proc file::commentTextBlock {text} { set cc [commentCharacters "Paragraph"] set c [lindex $cc 2] regsub -all "(\r|\n)" $text "\r${c}" text return "[lindex $cc 0]\r[lindex $cc 2]${text}\r[lindex $cc 1]\r" } ## # ------------------------------------------------------------------------- # # "file::functionCommentUpdate" -- # # Handles updating of a version line like the one below # # --Version--Author------------------Changes------------------------------- # 1.0 <darley@fas.harvard.edu> original # 1.1 <darley@fas.harvard.edu> quickly updated with shift-F1 # ------------------------------------------------------------------------- ## proc functioncomments::update {} { global user set begin [lindex [commentCharacters Paragraph] 2] goto [file::findLocally "${begin}--Version--Author"] goto [nextLineStart [nextLineStart [getPos] ]] goto [file::findLocally "${begin}-------"] elec::Insertion "${begin} •Version• $user(email) •Changes•\r" } ## # ------------------------------------------------------------------------- # # "file::findLocally" -- # # Looks around for a particular sequence of characters (or a regexp) # and returns the start of the closest fit, either fowards or backwards, # or "" if no match was found. # ------------------------------------------------------------------------- ## proc file::findLocally { chars {regexp 0} { pos "" } } { if { $pos == "" } { set pos [getPos] } set found1 [lindex [search -s -f 0 -n -r $regexp -- "$chars" $pos] 0] set found2 [lindex [search -s -f 1 -n -r $regexp -- "$chars" $pos] 0] if { $found1 != "" && $found2 != "" } { if [expr ($pos - $found1) <= ($found2 - $pos) ] { return $found1 } else { return $found2 } } # return whatever we can, possibly "" if { $found1 != "" } { return $found1 } else { if { $found2 == "" } { message "Couldn't find: $chars" } return $found2 } } ## # ------------------------------------------------------------------------- # # "file::updateFileVersion" -- # # Update the version number and information in the header block # of a file. Copes with both my old and new formats. # # ------------------------------------------------------------------------- ## proc file::updateFileVersion {} { global user # in case the user wishes to return quickly pushPosition goto 0 set begin [lindex [commentCharacters Paragraph] 2] set pos [file::findLocally "_/_/_" 0] if { $pos == "" || $pos > 1000 } { set srch [quote::WhitespaceReg [quote::Regfind "${begin} " ]] append srch {[0-9]+/[0-9]+/[0-9]+} set pos [file::findLocally $srch 1] if { $pos == "" } { message "Couldn't find original version template." set srch [quote::Regfind "${begin} "] append srch "See header file for further information" set pos [file::findLocally [quote::WhitespaceReg $srch]] if { $pos != "" } { set pos [nextLineStart $pos] } else { goto 0 set pos [file::findLocally "${begin}\#\#\#"] if { $pos == "" } { message "Couldn't find any header" ; return } set pos [lindex [search -s -f 1 -n -- "${begin}\#\#\#" [nextLineStart $pos]] 0] if { $pos == "" } { message "Couldn't find any header" ; return } } goto $pos set t "${begin}\r" append t "${begin} modified by rev reason\r" append t "${begin} -------- --- --- -----------\r" append t "${begin} [file::paddedDate] $user(author_initials) 1.0 original\r" insertText $t select $pos [getPos] return "" } else { # This is the normal case. # Find the last version number set p -1 while { $p != $pos } { set pos $p set p [file::findLocally $srch 1 [nextLineStart $p] ] } set pos [nextLineStart $pos] } } else { # old style header set pos [lineStart $pos] replaceText $pos [nextLineStart $pos] "" } # Now pos is at the start of the line where we wish to insert goto $pos elec::Insertion "${begin} [file::paddedDate] $user(author_initials) •• ••\r" message "Pop position to return to where you were." return "" } proc file::paddedDate {{when ""}} { if {$when == ""} { set when [now] } return [string range "[lindex [mtime $when short] 0] " 0 7] } proc file::created {{convert 1}} { if [catch {getFileInfo [win::Current] info}] { if $convert { return [mtime [now]] } else { return [now] } } else { if $convert { return [mtime $info(created)] } else { return $info(created) } } } ## # ------------------------------------------------------------------------- # # "file::createHeader" -- # # Insert a descriptive header into the current file. Needs to be tailored # more to different modes, but isn't too bad right now. # # 'forcemode' will force the file into that mode via emacs-like mode # entries on the top line of the file. # # 'parent' gives the name of a class from which the generated file # descends (appropriate for C++, [incr Tcl] for example). # # ------------------------------------------------------------------------- ## proc file::createHeader { {template ""} {parent "" } } { # Make sure the current project is compatible with this mode file::coordinateProjectForMode if {$parent == ""} {set parent "•parent•"} if {$template == ""} { set template [list "" "" "Header" "\#" "" ""] } # make the header if {[lindex $template 1] != "Empty" } { set t "" set class [file::className] if {$class == "Untitled"} {set class "•class name•"} set file [win::CurrentTail] set docHeadType [lindex $template 2] if {$docHeadType != "None" } { append t [file::topHeader] if {$docHeadType != "Basic"} { if {$docHeadType == "Source" || [file::isSource $file]} { # it's a source file append t " See header file for further information\r" } elseif {$docHeadType == "Header" || $docHeadType == "*" && [file::isHeader $file]} { global user append t " Description: \r" append t "\r" append t " History\r" append t "\r" append t " modified by rev reason\r" append t " -------- --- --- -----------\r" append t " [file::paddedDate [file::created 0]] $user(author_initials) 1.0 original\r" } else { # not header or source or basic... oh well! } } append t "###################################################################" set t [file::commentTextBlock $t] global mode regsub "\r" $t "-*-${mode}-*-\r" t } set procName [lindex $template 3] if {$procName != "\#" && [info commands $procName] == ""} { global PREFS if [catch {uplevel \#0 source \{$PREFS:prefs.tcl\}}] { alertnote "An error occurred while loading \"prefs.tcl\"" global errorInfo dumpTraces "prefs.tcl error" $errorInfo error "" } } if [catch {append t [eval $procName [list $class] [list $parent] [lindex $template 5]]}] { alertnote "An error occurred while calling \"$procName\"" global errorInfo dumpTraces "$procName error" $errorInfo error "" } goto 0 elec::Insertion $t } return "" } ## # ------------------------------------------------------------------------- # # "file::createDocument" -- # # Make a new document from a given template type. # # 'forcemode' will force the file into that mode via emacs-like mode # entries on the top line of the file. # # ------------------------------------------------------------------------- ## proc file::createDocument { {winCreate ""} {forcemode "" } } { # pick a template # if [fileIsHeader $file] global elec::DocTemplates mode DocprojmodeVars # decide if its mode-specific or not set f [lindex $winCreate 2] if $DocprojmodeVars(docTemplatesModeSpecific) { if {$forcemode != ""} { set tlist [file::docTemplates $f $forcemode non] } else { set tlist [file::docTemplates $f $mode non] } } else { set tlist [file::docTemplates $f "" non] } lappend tlist "<Create new document type>" if {$non != ""} { eval lappend tlist "----------------------------------------------------" [lsort $non] } set tchoice [listpick -p "Pick a document template to insert" -L "Default" $tlist] if {$tchoice == "<Create new document type>"} { set tchoice [file::newDocumentTemplate 1] } if {$tchoice == "----------------------------------------------------"} { error "" } set tinfo [file::docTemplateInfo $tchoice] set subTypes [lindex $tinfo 5] if {$subTypes != ""} { # replace the list of options with just the one selected set tinfo [lreplace $tinfo 5 5 [listpick -p "Pick a document subtype of $tchoice" $subTypes]] } if {$forcemode == "" && [lindex $tinfo 0] != "*"} { set forcemode [lindex $tinfo 0] } if {$winCreate != ""} { eval $winCreate } if { $forcemode != "" && $mode != $forcemode} { changeMode $forcemode } # we need to do this to stop modes switching later if this file isn't # obviously a '$mode' file. global win::Modes set win::Modes($f) $mode # set the project Docproj::changeProject [lindex $tinfo 4] # if the current project doesn't like this mode, then switch file::coordinateProjectForMode return $tinfo } proc file::docTemplates { {f ""} {modeSpecific ""} {other ""}} { global elec::DocTemplates if {$other != ""} { upvar $other noList } set tlist "" set noList "" if {$f != "" && $f != "Untitled"} { set m [file::whichModeForWin $f] foreach t ${elec::DocTemplates} { if [file::docTemplateMatchExt $t $f $m] { lappend tlist [lindex $t 1] } else { lappend noList [lindex $t 1] } } } else { foreach t ${elec::DocTemplates} { if {$modeSpecific == "" || [string match [lindex $t 0] $modeSpecific]} { lappend tlist [lindex $t 1] } else { lappend noList [lindex $t 1] } } } return [lsort $tlist] } proc file::docTemplateMatchExt {t f {m ""}} { if {$m == ""} {set m [file::whichModeForWin $f]} # match everything to a file with no particular extension if {$m == "Text"} { return 1 } set l [lindex $t 0] set mMatch [expr [lsearch -exact $l $m] != -1] switch [lindex $t 2] { "None" - "Basic" - "*" { if {$l == "*"} { return 1 } else { return $mMatch } } "Header" { if {$mMatch} { return [file::isHeader $f $m] } } "Source" { if {$mMatch} { return [file::isSource $f $m] } } } return 0 } proc file::docTemplateInfo {name} { global elec::DocTemplates foreach t ${elec::DocTemplates} { if {$name == [lindex $t 1]} { return $t } } } proc file::docTemplateIndex {name} { set i 0 global elec::DocTemplates foreach t ${elec::DocTemplates} { if {$name == [lindex $t 1]} { return $i } incr i } } proc file::notTextMode {} { global mode modeMenus if { $mode == "Text" } { # we probably don't want Text mode set m [listpick -p "Pick a mode:" -L "Text" [array names modeMenus]] if { $m == "" } {set m "Text"} changeMode $m } } ## # ------------------------------------------------------------------------- # # "file::topHeader" -- # # Inserts the top part of a descriptive header into the current file # ------------------------------------------------------------------------- ## proc file::topHeader { } { global user set file [win::CurrentTail] if [catch {getFileInfo [win::Current] info}] { set created [mtime [now]] set last_update $created } else { set created [mtime $info(created)] set last_update [mtime $info(modified)] } append t "###################################################################\r" if {[file::projectName] != "*"} { append t " [file::projectName] - [file::projectAddendum]\r" } append t "\r" append t " FILE: \"" $file "\"\r" append t " created: $created \r" append t " last update: $last_update \r" append t " Author: $user(author)\r" append t " E-mail: $user(email)\r" if {$user(organisation) != ""} { append t " mail: $user(organisation)\r" } if {$user(address) != ""} { append t " $user(address)\r" } if {$user(www) != ""} { append t " www: $user(www)\r" } append t " \r" append t [file::[file::projectLicense]] if {[set e [file::projectExtra]] != ""} { append t "[breakIntoLines $e]\r \r" } return $t } ## # ------------------------------------------------------------------------- # # "file::className" -- # # Extract root of file name as a class name for the file (obviously most # relevant to C++) # ------------------------------------------------------------------------- ## proc file::className {} { return [file::baseName [win::CurrentTail]] } ## # ------------------------------------------------------------------------- # # "file::coordinateProjectForMode" -- # # When we create a new file or header automatically, it contains # information about our current project (as defined in docProject(...)). # Unfortunately we often forget to select the correct project first. # This procedure makes sure that your project is compatible with the # current mode, given the information in the 'docProject' array. If it isn't # then the current project is changed if a better match can be found. # # Results: # None # # Side effects: # The current project may be changed # ------------------------------------------------------------------------- ## proc file::coordinateProjectForMode {} { global mode docProject set currProj [file::projectName] set projModes [lindex $docProject(default_modes) \ [lsearch -exact $docProject(name) [file::projectName]]] if { $projModes != "" && [lsearch -exact $projModes $mode] == -1 } { # this project doesn't like this mode. # see if there's a better one foreach modeLists $docProject(default_modes) { if { [lsearch -exact $modeLists $mode] != -1 } { # found a fit set index [lsearch -exact $docProject(default_modes) $modeLists] set proj [lindex $docProject(name) $index] Docproj::changeProject "$proj" return } } } } proc file::createNewClass {} { global mode # if the current project doesn't like this mode, then switch file::coordinateProjectForMode beep set class [statusPrompt "A name for the new class:"] set parent [statusPrompt "Descended from:" ] switch $mode { "C" - "C++" { file::createHeader [file::createDocument "new -n ${class}.cc" C++] $parent file::createHeader [file::createDocument "new -n ${class}.h" C++] $parent } "Tcl" { file::createHeader [file::createDocument "new -n ${class}.tcl" Tcl] $parent } default { message "No class procedure defined for your mode. Why not write one yourself?" } } } ## # ------------------------------------------------------------------------- # # "file::updateGeneralDate" -- # # Updates the date in the header of a file. Normally this is the # 'last update' date, but we can override that if desired. # ------------------------------------------------------------------------- ## proc file::updateGeneralDate { name {patt ""} {time ""}} { if {$patt == ""} {set patt {last update: }} regsub -all { } $patt {[ \t]} spatt set pos [getPos] set end [selEnd] set hour {[0-9][0-9]?(:|\.)[0-9][0-9]((:|\.)[0-9][0-9])?([ \t][APap][Mm])?} set date {[0-9][0-9]?(/|\.|\-)[0-9][0-9]?(/|\.|\-)[0-9][0-9]([0-9][0-9])?} append spatt {[ \t]*} $date {[ \t]\{?} $hour {\}?} if [catch {search -s -f 1 -r 1 -m 0 -l 1000 $spatt 0} datePos] {return} if {$time == ""} {set time [mtime [now] short]} if {[eval getText $datePos] == $time} {return} eval replaceText $datePos [list $patt $time] select $pos $end return } proc file::updateDate { {name ""} } { set fr [win::Current] if { $name == "" } { set name $fr } if { $name != $fr } { bringToFront $name file::updateGeneralDate $name bringToFront $fr } else { file::updateGeneralDate $name } } proc file::updateCreationDate { name } { if [catch {getFileInfo [stripNameCount [win::Current]] info}] { set created [mtime [now]] } else { set created [mtime $info(created)] } file::updateGeneralDate $name "created" $created } proc file::newFunction {} { elec::Insertion "[file::className]::•name•(•args•){\r\t•body•\r}\r" } proc global::newDocumentTemplate { {subCall 0} } { set newT [global::_editDocumentTemplate] global elec::DocTemplates lappend elec::DocTemplates $newT # save it permanently global modifiedVars lappend modifiedVars elec::DocTemplates # add template to "prefs.tcl" set procedure [lindex $newT 3] set subproj [lindex $newT 5] if {$procedure != "\#"} { set def [file::_getDefault "Do you want to use this as the template?"] set t "\r" append t "proc $procedure \{docname parentdoc" if {$subproj != ""} { append t " subtype " } append t "\} \{\r" append t "\t# You must fill this in\r" if {$subproj != ""} { append t "\t# Possible 'subtypes' are: $subproj\r" } append t $def append t "\r\treturn \$t\r\}\r" addUserLine $t if {[askyesno "I've added a template for the procedure to your 'prefs.tcl'. Do you want to edit it now?"] == "yes"} { global::editPrefsFile goto [maxPos] if $subCall { alertnote "Once you've finished editing, hit cmd-N to go back and create a new document." # so our calling proc stops error "Editing" } } } return [lindex $newT 1] } proc file::_varValue {var} { upvar $var a if [info exists a] { return $a } else { return "" } } proc file::_getDefault { text {default ""} {var "t"}} { if [isSelection] { if {[askyesno "I notice you've selected some text. $text"] == "yes"} { set default [getSelect] } } if {$default == ""} { set default [getline "Enter template text (you can edit it later)" $default] } return [elec::_MakeIntoInsertion $default $var] } proc global::_editDocumentTemplate {{def ""}} { global DocprojmodeVars if {$def == ""} { set title "Create a new document template" set def {"" "" "By File Extension" "t_XXX" $DocprojmodeVars(currentProject) ""} set new 1 } else { set title "Edit document template" set new 0 } global docProject set name "" while { $name == ""} { set y 40 set yb 220 set res [eval dialog -w 380 -h 340 \ [dialog::title $title 380] \ [dialog::button "OK" 290 yb] \ [dialog::button "Cancel" 290 yb] \ [dialog::textedit "Descriptive Name" [lindex $def 1] 10 y 15] \ [dialog::textedit "Modes (blank = all)" [lindex $def 0] 10 y 15] \ [dialog::textedit "Procedure name" [lindex $def 3] 10 y 15] \ [dialog::text "Descriptive header for this document template" 10 y] \ [dialog::text "(if 'Source', or 'Header', the mode must define" 10 y] \ [dialog::text "headerSuffices and sourceSuffices vars)" 10 y] \ [dialog::menu 10 y [list "None" "-" "Basic" "Source" "Header" "Either"] [lindex $def 2]] \ [dialog::text "Project name" 10 y] \ [dialog::menu 10 y $docProject(name) [lindex $def 4]] \ [dialog::textedit "List of sub-types" [lindex $def 5] 10 y 30] \ ] if [lindex $res 1] { error "Cancel" } set i 1 foreach var {name modes procedure filetype proj subproj} { set $var [lindex $res [incr i]] } if {$name == ""} { beep ; message "You must enter a name." } } if {$modes == ""} {set modes "*"} if {$filetype == "Either"} {set filetype "*"} if {$proj == "None"} {set proj "*"} if {$procedure == ""} {set procedure "\#"} return [list $modes $name $filetype $procedure $proj $subproj] } proc global::editDocumentTemplate {} { global modifiedVars elec::DocTemplates set tlist [file::docTemplates] set l [listpick -p "Which document template do you want to edit?" $tlist] set lind [file::docTemplateIndex $l] set l [global::_editDocumentTemplate [file::docTemplateInfo $l]] set elec::DocTemplates [lreplace ${elec::DocTemplates} $lind $lind $l] lappend modifiedVars elec::DocTemplates } proc global::removeDocumentTemplate {} { global modifiedVars elec::DocTemplates set tlist [file::docTemplates] set l [listpick -p "Which document template shall I permanently remove?" $tlist] set l [file::docTemplateIndex $l] set elec::DocTemplates [lreplace ${elec::DocTemplates} $l $l] lappend modifiedVars elec::DocTemplates } ## Create this sort of stuff. # set docProject(name) [list "None" "EvoX" "Vince's Additions" "Cpptcl"] # set docProject(addendum) { {none} {evolution in complex systems} \ # {an extension package for Alpha} {connecting C++ with Tcl} } # set docProject(default_modes) { {} {C C++} {Tcl} {C C++ Tcl}} ## proc global::newProject {} { global docProject set res [global::_editProject] set i -1 foreach var {name addendum license extra default_modes} { lappend docProject($var) [lindex $res [incr i]] } global modifiedArrVars lappend modifiedArrVars docProject addMenuItem -m {Current Project} [lindex $res 0] Docproj::changeProject [lindex $res 0] } proc global::_editProject {{def ""}} { if {$def == ""} { set title "Create a new project" set def [list "Vince's Additions" "an extension package for Alpha" "license.terms" "See the file \"license.terms\" for information on usage and redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES." ""] } else { set title "Edit a project" } set y 40 set yb 270 global elec::LicenseTemplates set res [eval dialog -w 380 -h 325 \ [dialog::title $title 360] \ [dialog::button "OK" 290 yb] \ [dialog::button "Cancel" 290 yb] \ [dialog::textedit "Short Descriptive Name" [lindex $def 0] 10 y 15] \ [dialog::textedit "Longer Description to append to the above" [lindex $def 1] 10 y 25] \ [dialog::text "License type for header comments" 10 y] \ [dialog::menu 10 y ${elec::LicenseTemplates} [lindex $def 2]] \ [dialog::textedit "Additional text for end of header comments" [lindex $def 3] 10 y 35 5] \ [dialog::textedit "Modes (blank = all)" [lindex $def 4] 10 y 15] \ ] if [lindex $res 1] { error "Cancel" } return [lrange $res 2 6] } proc global::editProject {} { global docProject modifiedArrVars set l [listpick -p "Which project do you wish to edit?" \ -L [file::projectName] $docProject(name)] set item [lsearch -exact $docProject(name) $l] foreach uvar {name addendum license extra default_modes} { lappend def [lindex $docProject($uvar) $item] } set def [global::_editProject $def] set i -1 foreach uvar {name addendum license extra default_modes} { set docProject($uvar) [lreplace $docProject($uvar) $item $item [lindex $def [incr i]]] } lappend modifiedArrVars docProject } proc global::removeProject {} { global docProject modifiedArrVars set l [listpick -p "Which project shall I permanently remove?" $docProject(name)] set item [lsearch -exact $docProject(name) $l] foreach uvar {name addendum license extra default_modes} { set docProject($uvar) [lreplace $docProject($uvar) $item $item] } lappend modifiedArrVars docProject if {[file::projectName] == $l} { Docproj::changeProject "None" } deleteMenuItem -m {Current Project} $l }